home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / mint / shells / bashsrc.zoo / jobs.h < prev    next >
C/C++ Source or Header  |  1991-06-05  |  4KB  |  129 lines

  1. /* jobs.h -- structures and stuff used by the jobs.c file. */
  2.  
  3. #include "quit.h"
  4.  
  5. #if !defined (NO_WAIT_H)
  6. #include <sys/wait.h>
  7. #else
  8.  
  9. #ifdef LITTLE_ENDIAN
  10. union wait
  11.   {
  12.     int    w_status;        /* used in syscall */
  13.  
  14.     /* Terminated process status. */
  15.     struct
  16.       {
  17.     unsigned short
  18.       w_Termsig  : 7,    /* termination signal */
  19.       w_Coredump : 1,    /* core dump indicator */
  20.       w_Retcode  : 8,    /* exit code if w_termsig==0 */
  21.       w_Fill1    : 16;    /* high 16 bits unused */
  22.       } w_T;
  23.  
  24.     /* Stopped process status.  Returned
  25.        only for traced children unless requested
  26.        with the WUNTRACED option bit. */
  27.     struct
  28.       {
  29.     unsigned short
  30.       w_Stopval : 8,    /* == W_STOPPED if stopped */
  31.       w_Stopsig : 8,    /* actually zero on XENIX */
  32.       w_Fill2   : 16;    /* high 16 bits unused */
  33.       } w_S;
  34.   };
  35.  
  36. #else /* if !LITTLE_ENDIAN */
  37.  
  38. /* For big-endian machines. */
  39.  
  40. union wait
  41.   {
  42.     int    w_status;        /* used in syscall */
  43.  
  44.     /* Terminated process status. */
  45.     struct
  46.       {
  47.     unsigned short w_Fill1    : 16;    /* high 16 bits unused */
  48.     unsigned       w_Retcode  : 8;    /* exit code if w_termsig==0 */
  49.     unsigned       w_Coredump : 1;    /* core dump indicator */
  50.     unsigned       w_Termsig  : 7;    /* termination signal */
  51.       } w_T;
  52.  
  53.     /* Stopped process status.  Returned
  54.        only for traced children unless requested
  55.        with the WUNTRACED option bit. */
  56.     struct
  57.       {
  58.     unsigned short w_Fill2   : 16;    /* high 16 bits unused */
  59.     unsigned       w_Stopsig : 8;    /* signal that stopped us */
  60.     unsigned       w_Stopval : 8;    /* == W_STOPPED if stopped */
  61.       } w_S;
  62.   };
  63.  
  64. #endif /* LITTLE_ENDIAN */
  65.  
  66. #define    w_termsig w_T.w_Termsig
  67. #define w_coredump w_T.w_Coredump
  68. #define w_retcode w_T.w_Retcode
  69. #define w_stopval w_S.w_Stopval
  70. #define w_stopsig w_S.w_Stopsig
  71.  
  72. #define    WSTOPPED 0177
  73. #define WIFSTOPPED(x) (((x) . w_stopval) == WSTOPPED)
  74. #define WIFEXITED(x) ((! (WIFSTOPPED (x))) && (((x) . w_termsig) == 0))
  75. #define WIFSIGNALED(x) ((! (WIFSTOPPED (x))) && (((x) . w_termsig) != 0))
  76.  
  77. #endif  /* NO_WAIT_H */
  78.  
  79. /* Make sure that parameters to wait3 are defined. */
  80. #ifndef WNOHANG
  81. #define WNOHANG 1
  82. #define WUNTRACED 2
  83. #endif
  84.  
  85. /* I looked it up.  For pretty_print_job ().  The real answer is 24. */
  86. #define LONGEST_SIGNAL_DESC 20
  87.  
  88. /* We keep an array of jobs.  Each entry in the array is a linked list
  89.    of processes that are piped together.  The first process encountered is
  90.    the group leader. */
  91.  
  92. /* Each child of the shell is remembered in a STRUCT PROCESS.  A chain of
  93.    such structures is a pipeline.  The chain is circular. */
  94. typedef struct process {
  95.   struct process *next;    /* Next process in the pipeline.  A circular chain. */
  96.   int pid;        /* Process ID. */
  97.   union wait status;    /* The status of this command as returned by wait. */
  98.   int running;        /* Non-zero if this process is running. */
  99.   char *command;    /* The particular program that is running. */
  100. } PROCESS;
  101.  
  102. /* A description of a pipeline's state. */
  103. typedef enum { JRUNNING, JSTOPPED, JDEAD, JMIXED } JOB_STATE;
  104. #define JOBSTATE(job) (jobs[(job)]->state)
  105.  
  106. typedef struct job {
  107.   char *wd;        /* The working directory at time of invocation. */
  108.   PROCESS *pipe;    /* The pipeline of processes that make up this job. */
  109.   int pgrp;        /* The process ID of the process group (necessary). */
  110.   int foreground;    /* Non-zero if this is running in the foreground. */
  111.   int notified;        /* Non-zero if already notified about job state. */
  112.   JOB_STATE state;    /* The state that this job is in. */
  113.   int job_control;    /* Non-zero if this job started under job control. */
  114. #ifdef JOB_CONTROL
  115.   COMMAND *deferred;    /* Commands that will execute when this job is done. */
  116. #endif
  117. } JOB;
  118.  
  119. #define NO_JOB -1    /* An impossible job array index. */
  120. #define DUP_JOB -2    /* A possible return value for get_job_spec (). */
  121.  
  122. /* Stuff from the jobs.c file. */
  123. extern int last_made_pid;
  124. extern int current_job, previous_job;
  125. extern int asynchronous_notification;
  126. extern JOB **jobs;
  127. extern int job_slots;
  128.  
  129.